package com.cn.jx.manager.service.mtn.Impl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.cn.jx.common.service.BaseService;
import com.cn.jx.manager.dao.RoleRepository;
import com.cn.jx.manager.dao.RoleResourceRepository;
import com.cn.jx.manager.dao.UserRoleRepository;
import com.cn.jx.manager.form.RoleForm;
import com.cn.jx.manager.po.Role;
import com.cn.jx.manager.po.RoleResource;
import com.cn.jx.manager.service.mtn.IRoleServiceMtn;
import com.jx.enumType.OperatEnum;
import com.jx.exception.MyException;
import com.jx.util.ObjectTransUtil;
import com.jx.util.Utility;

/**
 * 
 * @author 姜旭
 * @version v1.11.20.2019
 * @since 
 * <p>创建时间：2019年12月1日
 * <p>功能描述：角色操作服务接口
 * <p>官方网站：management/admin/index
 * <p>邮箱地址：524577360@qq.com
 */
@Service("roleServiceMtn") 
@Transactional
public class RoleServiceImplMtn extends BaseService implements IRoleServiceMtn {

	/**定义{@link RoleRepository roleDao <tt>角色Dao层接口定义</tt>}*/
	@Autowired
	private RoleRepository roleDao;
	
	/**定义{@link RoleResourceRepository roleResourceDao <tt>角色资源关系Dao层接口定义</tt>}*/
	@Autowired
	private RoleResourceRepository roleResourceDao;
	
	/**定义{@link UserRoleRepository userRoleDao <tt>角色人员关系Dao层接口定义</tt>}*/
	@Autowired
	private UserRoleRepository userRoleDao;


	/* 保存更新角色 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void saveOrUpdateRole(RoleForm role) throws MyException {
		if (Utility.isNotBlank(role.getId())) {
			Role roles = findEntityByPkid(role.getId(), Role.class);// 得到库中的数据
			Role uo = ObjectTransUtil.getUpdateObj(roles, role);// 表单中的赋值给数据库的
			if (uo != null) {
				// 更新后清理缓存
//				redisUtil.hdelItem("roleServiceQry", "getRoleById=" + role.getId());
				uo.setOperatUser(role.getOperatUser());
				uo.setOperatTime(new Date());
				roleDao.save(uo);// 更新
				// 保存日志
				logUtil.LogMsg(Role.class, role.getId(), OperatEnum.UPDATE, role.getOperatUser());
			}
		} else {
			Role r = Role.getInstance(role.getOperatUser());
			r.setRoleCode(Utility.replaceSpecialStr(role.getRoleCode()));
			r.setRoleName(Utility.replaceSpecialStr(role.getRoleName()));
			r.setDescrb(Utility.replaceSpecialStr(role.getDescrb()));
			Role rr = roleDao.save(r);
			// 保存日志
			logUtil.LogMsg(Role.class, rr.getId(), OperatEnum.SAVE, role.getOperatUser());
		}
		//清理所有查询所有角色的
//		redisUtil.hdel("roleServiceQry_findAllRole");
		//清理查询角色名
//		redisUtil.hdel("roleServiceQry_getroleAllName");
		
	}

	/* 删除角色 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void delRole(List<String> id, String opertor) throws Exception {
		try {
			// 删除角色
			deleteEntityByIds(id, Role.class);
			// 删除角色对应的资源关系
			roleResourceDao.deleteRealationByRoleList(id);
			//删除角色和员工的关系
			userRoleDao.deleteRealationByRoleIds(id);
			
			//清理所有查询所有角色的
//			redisUtil.hdel("roleServiceQry_findAllRole");
			//清理查询角色名
//			redisUtil.hdel("roleServiceQry_getroleAllName");
			
			// 保存日志
			logUtil.LogMsg(Role.class, Utility.getListToStr(id), OperatEnum.DELETE, opertor);
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new MyException(e.getMessage());
		}
	}

	/* 移除角色 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void removeRole(List<String> id, String opertor) throws Exception {
		try {
			removeEntityByIds(id, Role.class);
			// 保存日志
			logUtil.LogMsg(Role.class, Utility.getListToStr(id), OperatEnum.REMOVE, opertor);
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new MyException(e.getMessage());
		}
	}
	
	/* 清空*/
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void removeRoleAll(String opertor) throws Exception {
		removeAllEntity(Role.class);
		// 保存日志
		logUtil.LogMsg(Role.class, "ALL", OperatEnum.REMOVE, opertor);
	}

	
	/* 找回回收站 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public void recoverRole(List<String> id, String opertor) throws Exception {
		recoverEntityById(id, Role.class);
		// 清理所有查询所有角色的
//		redisUtil.hdel("roleServiceQry_findAllRole");
		// 保存日志
		logUtil.LogMsg(Role.class, Utility.getListToStr(id), OperatEnum.RECOVER, opertor);
	}

	/* 给角色分派资源 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
//	@RedisCacheRemove(key="roleService",value="'findAllResourceByRole='.concat(#roleId)")
	public void addRoleResource(String roleId, String[] resourceId, String opertor) throws Exception {
		try {
			// 第一步删除此角色的所有资源权限
			roleResourceDao.deleteRoleResourceRealationByRole(roleId);

			// 第二步分别保存新的资源
			for (String resid : resourceId) {// 循环传入的
				RoleResource rr = RoleResource.getInstance();
				rr.setResourceId(resid);
				rr.setRoleId(roleId);
				roleResourceDao.save(rr);
			}
			
			//清理所有查询所有角色的
//			redisUtil.hdel("roleServiceQry_findAllRole");
			//清理查询角色名
//			redisUtil.hdel("roleServiceQry_getroleAllName");
			
			// 保存日志
			logUtil.LogMsg(Role.class, roleId, OperatEnum.RESOURCE_ALLOT, opertor);
			
		}catch (Exception e) {
			e.printStackTrace();
			throw new MyException(e.getMessage());
		}
	}
}
